Passed
Push — master ( 9aad84...1f5b8c )
by EMP
01:27
created

main.js ➔ deleteContact   A

Complexity

Conditions 3

Size

Total Lines 14
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 9
dl 0
loc 14
rs 9.95
c 0
b 0
f 0
cc 3
1
"use strict";
2
3
sodium.ready.then(function() {
4
5
const ae = new AllEars(function(ok) {
6
	if (ok) {
7
		document.getElementById("btn_enter").disabled = false;
8
	} else {
9
		document.getElementById("begin_message").hidden = false;
10
		document.getElementById("begin_message").textContent = "Failed init";
11
	}
12
});
13
14
let page=0;
15
16
function navMenu(num) {
17
	document.getElementById("div_readmsg").hidden = true;
18
19
	const b = document.getElementsByTagName("nav")[0].getElementsByTagName("button");
20
	const d = document.getElementsByClassName("maindiv");
21
22
	for (let i = 0; i < 5; i++) {
23
		if (i === num) {
24
			b[i].disabled = true;
25
			d[i].hidden = false;
26
		} else {
27
			b[i].disabled = false;
28
			d[i].hidden = true;
29
		}
30
	}
31
}
32
33
function getCountryFlag(countryCode) {
34
	return sodium.to_string(new Uint8Array([
35
		240, 159, 135, 166 + countryCode.codePointAt(0) - 65,
36
		240, 159, 135, 166 + countryCode.codePointAt(1) - 65
37
	]));
38
}
39
40
function deleteButtonShow(show) {
41
	if (show) {
42
		document.getElementById("btn_msgdel").hidden = false;
43
		return;
44
	}
45
46
	const checkboxes = document.getElementById("tbd_inbox").getElementsByTagName("input");
47
	let checked = false;
48
49
	for (let j = 0; j < checkboxes.length; j++) {
50
		if (checkboxes[j].checked) {
51
			checked = true;
52
			break;
53
		}
54
	}
55
56
	document.getElementById("btn_msgdel").hidden = !checked;
57
}
58
59
function addIntMessage(i) {
60
	const tbl = document.getElementById("tbd_inbox");
61
	const row = tbl.insertRow(-1);
62
63
	const ts = ae.getIntMsgTime(i);
64
	let cell = row.insertCell(-1);
65
	cell.setAttribute("data-ts", ts);
66
	cell.textContent = new Date(ts * 1000).toISOString().slice(0, 16).replace("T", " ");
67
	cell.className = "mono";
68
69
	cell = row.insertCell(-1);
70
	cell.textContent = ae.getIntMsgTitle(i);
71
	cell.onclick = function() {
72
		navMenu(-1);
73
		document.getElementById("div_readmsg").hidden = false;
74
		document.getElementById("readmsg_head").hidden = false;
75
		document.getElementById("readmsg_levelinfo").hidden = false;
76
		document.getElementById("readmsg_extmsg").hidden = true;
77
78
		document.getElementById("readmsg_title").textContent = ae.getIntMsgTitle(i);
79
		document.getElementById("readmsg_from").textContent  = ae.getIntMsgFrom(i);
80
		document.getElementById("readmsg_to").textContent    = ae.getIntMsgTo(i);
81
		document.getElementById("readmsg_body").textContent  = ae.getIntMsgBody(i);
82
		document.getElementById("readmsg_level").textContent = ae.getIntMsgLevel(i);
83
84
		document.getElementById("readmsg_from").className = (ae.getIntMsgFrom(i).length === 16) ? "mono" : "";
85
		document.getElementById("readmsg_to").className = (ae.getIntMsgTo(i).length === 16) ? "mono" : "";
86
	};
87
88
	// empty From1 cell
89
	row.insertCell(-1);
90
91
	cell = row.insertCell(-1);
92
	cell.textContent = ae.getIntMsgFrom(i);
93
	cell.className = (ae.getIntMsgFrom(i).length === 16) ? "mono" : "";
94
95
	cell = row.insertCell(-1);
96
	cell.textContent = ae.getIntMsgTo(i);
97
	cell.className = (ae.getIntMsgTo(i).length === 16) ? "mono" : "";
98
99
	cell = row.insertCell(-1);
100
	const el = document.createElement("input");
101
	el.className = "delMsg";
102
	el.type = "checkbox";
103
	el.setAttribute("data-id", ae.getIntMsgIdHex(i));
104
	el.onchange = function() {deleteButtonShow(this.checked);};
105
	cell.appendChild(el);
106
}
107
108
function addExtMessage(i) {
109
	const tbl = document.getElementById("tbd_inbox");
110
	const row = tbl.insertRow(-1);
111
112
	const ts = ae.getExtMsgTime(i);
113
	let cell = row.insertCell(-1);
114
	cell.setAttribute("data-ts", ts);
115
	cell.textContent = new Date(ts * 1000).toISOString().slice(0, 16).replace("T", " ");
116
	cell.className = "mono";
117
118
	cell = row.insertCell(-1);
119
	cell.textContent = ae.getExtMsgTitle(i);
120
	cell.onclick = function() {
121
		navMenu(-1);
122
		document.getElementById("div_readmsg").hidden = false;
123
		document.getElementById("readmsg_head").hidden = false;
124
		document.getElementById("readmsg_levelinfo").hidden = true;
125
		document.getElementById("readmsg_extmsg").hidden = false;
126
		document.getElementById("readmsg_greet").textContent = ae.getExtMsgGreet(i);
127
		document.getElementById("readmsg_tls").textContent = ae.getExtMsgTLS(i);
128
		document.getElementById("readmsg_ip").textContent = ae.getExtMsgIp(i);
129
130
		document.getElementById("readmsg_country").textContent = getCountryFlag(ae.getExtMsgCcode(i));
131
		document.getElementById("readmsg_country").title = ae.getExtMsgCname(i);
132
133
		const flags = document.getElementById("readmsg_flags").children;
134
		flags[0].hidden = ae.getExtMsgFlagPExt(i);
135
		flags[1].hidden = !ae.getExtMsgFlagRare(i);
136
		flags[2].hidden = !ae.getExtMsgFlagFail(i);
137
		flags[3].hidden = !ae.getExtMsgFlagPErr(i);
138
139
		document.getElementById("readmsg_title").textContent = ae.getExtMsgTitle(i);
140
		document.getElementById("readmsg_from").textContent = ae.getExtMsgEnvFrom(i);
141
		document.getElementById("readmsg_to").textContent = ae.getExtMsgEnvTo(i);
142
		document.getElementById("readmsg_body").innerHTML = ae.getExtMsgBody(i, false);
143
		document.getElementById("readmsg_headers").textContent = ae.getExtMsgHeaders(i);
144
145
		document.getElementById("readmsg_from").className = "";
146
		document.getElementById("readmsg_to").className = (ae.getExtMsgEnvTo(i).length === 16) ? "mono" : "";
147
	};
148
149
	const from = ae.getExtMsgHdrFrom(i);
150
	const from2 = from.substring(from.indexOf("@") + 1);
151
152
	cell = row.insertCell(-1);
153
	cell.textContent = from.substring(0, from.indexOf("@"));
154
155
	cell = row.insertCell(-1);
156
157
	let el = document.createElement("abbr");
158
	el.textContent = getCountryFlag(ae.getExtMsgCcode(i));
159
	el.title = ae.getExtMsgCname(i);
160
	cell.appendChild(el);
161
162
	el = document.createElement("span");
163
	el.textContent = " " + from2;
164
	cell.appendChild(el);
165
166
	cell = row.insertCell(-1);
167
	cell.textContent = ae.getExtMsgEnvTo(i);
168
	cell.className = (ae.getExtMsgEnvTo(i).length === 16) ? "mono" : "";
169
170
	cell = row.insertCell(-1);
171
	el = document.createElement("input");
172
	el.className = "delMsg";
173
	el.type = "checkbox";
174
	el.setAttribute("data-id", ae.getExtMsgIdHex(i));
175
	el.onchange = function() {deleteButtonShow(this.checked);};
176
	cell.appendChild(el);
177
}
178
179
function addMessages() {
180
	const maxExt = ae.getExtMsgCount();
181
	const maxInt = ae.getIntMsgCount();
182
183
	let numExt = 0;
184
	let numInt = 0;
185
186
	for (let i = 0; i < (page * 20) + 20; i++) {
187
		const tsInt = (numInt < maxInt) ? ae.getIntMsgTime(numInt) : 0;
188
		const tsExt = (numExt < maxExt) ? ae.getExtMsgTime(numExt) : 0;
189
		if (tsInt === 0 && tsExt === 0) break;
190
191
		if (tsInt !== 0 && (tsExt === 0 || tsInt > tsExt)) {
192
			if (i < (page * 20)) {
193
				numInt++;
194
				continue;
195
			}
196
197
			addIntMessage(numInt);
198
			numInt++;
199
		} else if (tsExt !== 0) {
200
			if (i < (page * 20)) {
201
				numExt++;
202
				continue;
203
			}
204
205
			addExtMessage(numExt);
206
			numExt++;
207
		}
208
	}
209
}
210
211
function addFile(num) {
212
	const table = document.getElementById("tbody_files");
213
	const row = table.insertRow(-1);
214
215
	let cell = row.insertCell(-1);
216
	cell.textContent = new Date(ae.getUplMsgTime(num) * 1000).toISOString().slice(0, 10);
217
218
	cell = row.insertCell(-1);
219
	cell.textContent = (ae.getUplMsgBytes(num) / 1024).toFixed(2);
220
221
	cell = row.insertCell(-1);
222
	cell.textContent = ae.getUplMsgTitle(num);
223
224
	cell = row.insertCell(-1);
225
	cell.innerHTML = "<button type=\"button\">D</button>";
226
	cell.children[0].onclick = function() {ae.downloadUplMsg(num);};
227
228
	cell = row.insertCell(-1);
229
	cell.innerHTML = "<button type=\"button\">X</button>";
230
	cell.children[0].onclick = function() {
231
		ae.Message_Delete([ae.getUplMsgIdHex(num)], function(error) {
232
			if (error === 0) {
233
				row.remove();
234
			} else {
235
				console.log("Failed deleting file");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
236
			}
237
		});
238
	};
239
}
240
241
function deleteAccount(uid) {
242
	const tbl = document.getElementById("tbody_admin");
243
244
	let rowid = -1;
245
246
	for (let i = 0; i < tbl.rows.length; i++) {
247
		if (uid === tbl.rows[i].cells[0].textContent) {
248
			rowid = i;
249
			break;
250
		}
251
	}
252
253
	if (rowid === -1) return;
254
255
	ae.Account_Delete(uid, function(error) {
256
		if (error === 0) {
257
			tbl.deleteRow(rowid);
258
		} else {
259
			console.log("Failed to destroy account");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
260
		}
261
	});
262
}
263
264
function setAccountLevel(uid, level) {
265
	const tbl = document.getElementById("tbody_admin");
266
267
	let rowid = -1;
268
269
	for (let i = 0; i < tbl.rows.length; i++) {
270
		if (tbl.rows[i].cells[0].textContent === uid) {
271
			rowid = i;
272
			break;
273
		}
274
	}
275
276
	if (rowid === -1) return;
277
278
	ae.Account_Update(uid, level, function(error) {
279
		if (error !== 0) {
280
			console.log("Failed to set account level");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
281
			return;
282
		}
283
284
		tbl.rows[rowid].cells[4].textContent = level;
285
286
		if (level === 0) {
287
			tbl.rows[rowid].cells[5].children[0].disabled = false;
288
			tbl.rows[rowid].cells[6].children[0].disabled = true;
289
		} else if (level === ae.getLevelMax()) {
290
			tbl.rows[rowid].cells[5].children[0].disabled = true;
291
			tbl.rows[rowid].cells[6].children[0].disabled = false;
292
		} else {
293
			tbl.rows[rowid].cells[5].children[0].disabled = false;
294
			tbl.rows[rowid].cells[6].children[0].disabled = false;
295
		}
296
297
		const uid = ae.admin_getUserUid(rowid);
298
		const currentLevel = ae.admin_getUserLvl(rowid);
299
		tbl.rows[rowid].cells[5].children[0].onclick = function() {setAccountLevel(uid, currentLevel + 1);};
300
		tbl.rows[rowid].cells[6].children[0].onclick = function() {setAccountLevel(uid, currentLevel - 1);};
301
	});
302
}
303
304
function deleteAddress(num) {
305
	if (num < 0) return;
306
307
	let btns = document.getElementById("tbody_opt_addr").getElementsByTagName("button");
308
	for (let i = 0; i < btns.length; i++) btns[i].disabled = true;
309
310
	ae.Address_Delete(num, function(error) {
311
		if (error !== 0) {
312
			console.log("Failed to delete address");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
313
			return;
314
		}
315
316
		document.getElementById("tbody_opt_addr").deleteRow(num);
317
		document.getElementById("send_from").remove(num);
318
319
		document.getElementById("addr_use_normal").textContent = ae.getAddressCountNormal();
320
		document.getElementById("addr_use_shield").textContent = ae.getAddressCountShield();
321
322
		if (ae.getAddressCountNormal() < ae.getLimitNormalA(ae.getOwnLevel())) document.getElementById("btn_newaddress").disabled = false;
323
		if (ae.getAddressCountShield() < ae.getLimitShieldA(ae.getOwnLevel())) document.getElementById("btn_newshieldaddress").disabled = false;
324
325
		ae.Private_Update(function(error2) {
326
			if (error2 !== 0) console.log("Failed to update the Private field");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
327
328
			btns = document.getElementById("tbody_opt_addr").getElementsByTagName("button");
329
			for (let i = 0; i < btns.length; i++) btns[i].disabled = false;
330
		});
331
	});
332
}
333
334
function addCellbox(row, checked) {
335
	let cell = row.insertCell(-1);
336
	let el = document.createElement("input");
337
	el.type = "checkbox";
338
	el.checked = checked;
339
	cell.appendChild(el);
340
}
341
342
function addAddress(num) {
343
	const addrTable = document.getElementById("tbody_opt_addr");
344
	const row = addrTable.insertRow(-1);
345
346
	let cell = row.insertCell(-1);
347
	cell.textContent = ae.getAddress(num);
348
	if (cell.textContent.length === 16) cell.className = "mono";
349
	cell.onclick = function() {navigator.clipboard.writeText(((this.textContent.length === 16) ? ae.shieldMix(this.textContent) : this.textContent) + "@" + ae.getDomainEml());};
350
351
	addCellbox(row, ae.getAddressAccExt(num));
352
	addCellbox(row, ae.getAddressAccInt(num));
353
	addCellbox(row, ae.getAddressAllVer(num));
354
	addCellbox(row, ae.getAddressAttach(num));
355
	addCellbox(row, ae.getAddressSecure(num));
356
	addCellbox(row, ae.getAddressOrigin(num));
357
358
	cell = row.insertCell(-1);
359
	let el = document.createElement("button");
360
	el.type = "button";
361
	el.textContent = "X";
362
	el.onclick = function() {deleteAddress(num);};
363
	cell.appendChild(el);
364
365
	el = document.createElement("option");
366
	el.value = ae.getAddress(num);
367
	el.textContent = ae.getAddress(num) + "@" + ae.getDomainEml();
368
	document.getElementById("send_from").appendChild(el);
369
}
370
371
function clearMessages() {
372
	document.getElementById("tbd_inbox").innerHTML = "";
373
	document.getElementById("tbd_snbox").innerHTML = "";
374
	document.getElementById("tbody_files").innerHTML = "";
375
}
376
377
function delMsgs(tblName, btnName) {
378
	const cbs = document.getElementsByClassName("delMsg");
379
	const ids = [];
380
381
	for (let i = 0; i < cbs.length; i++) {
382
		if (cbs[i].checked) ids.push(cbs[i].getAttribute("data-id"));
383
	}
384
385
	if (ids.length > 0) ae.Message_Delete(ids, function(error) {
386
		if (error === 0) {
387
			clearMessages();
388
			addMessages();
389
			document.getElementById(btnName).hidden = true;
390
		} else {
391
			console.log("Failed to delete messages");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
392
		}
393
	});
394
}
395
396
function deleteContact(email) {
397
	const tbl = document.getElementById("tbody_notes_contact");
398
	const rows = tbl.rows;
399
400
	for (let i = 0; i < rows.length; i++) {
401
		if (email === rows[i].cells[0].textContent) {
402
			ae.deleteContact(i);
403
			tbl.deleteRow(i);
404
			break;
405
		}
406
	}
407
408
	document.getElementById("btn_savenotes").hidden = false;
409
}
410
411
function addContactToTable(mail, name, note) {
412
	const contactTable = document.getElementById("tbody_notes_contact");
413
	const row = contactTable.insertRow(-1);
414
	const cellMail = row.insertCell(-1);
415
	const cellName = row.insertCell(-1);
416
	const cellNote = row.insertCell(-1);
417
	const cellBtnD = row.insertCell(-1);
418
419
	cellMail.className = "left";
420
	cellName.className = "left";
421
	cellNote.className = "left";
422
423
	cellMail.textContent = mail;
424
	cellName.textContent = name;
425
	cellNote.textContent = note;
426
	cellBtnD.innerHTML = "<button type=\"button\">X</button>";
427
428
	cellBtnD.onclick = function() {deleteContact(mail);};
429
}
430
431
function addRowAdmin(num) {
432
	const table = document.getElementById("tbody_admin");
433
434
	const row = table.insertRow(-1);
435
	const cellUn = row.insertCell(-1);
436
	const cellMb = row.insertCell(-1);
437
	const cellNa = row.insertCell(-1);
438
	const cellSa = row.insertCell(-1);
439
	const cellLv = row.insertCell(-1);
440
	const cellBtnPl = row.insertCell(-1);
441
	const cellBtnMn = row.insertCell(-1);
442
	const cellBtnDe = row.insertCell(-1);
443
444
	cellUn.textContent = ae.uidToName(ae.admin_getUserUid(num));
445
	cellMb.textContent = Math.round(ae.admin_getUserKib(num) / 1024);
446
	cellNa.textContent = ae.admin_getUserNrm(num);
447
	cellSa.textContent = ae.admin_getUserShd(num);
448
	cellLv.textContent = ae.admin_getUserLvl(num);
449
	cellBtnPl.innerHTML = "<button type=\"button\">+</button>";
450
	cellBtnMn.innerHTML = "<button type=\"button\">-</button>";
451
	cellBtnDe.innerHTML = "<button type=\"button\">X</button>";
452
453
	cellUn.className = "mono";
454
	if (ae.admin_getUserLvl(num) === ae.getLevelMax()) cellBtnPl.children[0].disabled = true;
455
	if (ae.admin_getUserLvl(num) === 0) cellBtnMn.children[0].disabled = true;
456
457
	const uid = ae.admin_getUserUid(num);
458
	const currentLevel = ae.admin_getUserLvl(num);
459
	cellBtnPl.children[0].onclick = function() {setAccountLevel(uid, currentLevel + 1);};
460
	cellBtnMn.children[0].onclick = function() {setAccountLevel(uid, currentLevel - 1);};
461
	cellBtnDe.children[0].onclick = function() {deleteAccount(uid);};
462
}
463
464
function reloadInterface() {
465
	if (!ae.isUserAdmin()) document.getElementById("btn_toadmin").hidden = true;
466
	document.getElementById("div_begin").hidden = true;
467
	document.getElementById("div_allears").hidden = false;
468
469
	clearMessages();
470
	document.getElementById("tbody_admin").innerHTML = "";
471
	document.getElementById("tbody_files").innerHTML = "";
472
	document.getElementById("tbody_notes_contact").innerHTML = "";
473
	document.getElementById("tbody_opt_addr").innerHTML = "";
474
475
	// Contacts
476
	for (let i = 0; i < ae.getContactCount(); i++) {
477
		addContactToTable(
478
			ae.getContactMail(i),
479
			ae.getContactName(i),
480
			ae.getContactNote(i)
481
		);
482
	}
483
484
	// Addresses
485
	for (let i = 0; i < ae.getAddressCount(); i++) {
486
		addAddress(i);
487
	}
488
489
	document.getElementById("addr_use_normal").textContent = ae.getAddressCountNormal();
490
	document.getElementById("addr_use_shield").textContent = ae.getAddressCountShield();
491
	document.getElementById("addr_max_normal").textContent = ae.getLimitNormalA(ae.getOwnLevel());
492
	document.getElementById("addr_max_shield").textContent = ae.getLimitShieldA(ae.getOwnLevel());
493
494
	if (ae.getAddressCountNormal() >= ae.getLimitNormalA(ae.getOwnLevel())) document.getElementById("btn_newaddress").disabled = true;
495
	if (ae.getAddressCountShield() >= ae.getLimitShieldA(ae.getOwnLevel())) document.getElementById("btn_newshieldaddress").disabled = true;
496
497
	if (ae.isUserAdmin()) {
498
		const tblLimits = document.getElementById("tbl_limits");
499
		for (let i = 0; i < 4; i++) {
500
			tblLimits.rows[i].cells[1].children[0].value = ae.getLimitStorage(i);
501
			tblLimits.rows[i].cells[2].children[0].value = ae.getLimitNormalA(i);
502
			tblLimits.rows[i].cells[3].children[0].value = ae.getLimitShieldA(i);
503
		}
504
505
		document.getElementById("btn_admin_savelimits").onclick = function() {
506
			const storageLimit = [];
507
			const addrNrmLimit = [];
508
			const addrShdLimit = [];
509
510
			for (let i = 0; i < 4; i++) {
511
				storageLimit[i] = tblLimits.rows[i].cells[1].children[0].value;
512
				addrNrmLimit[i] = tblLimits.rows[i].cells[2].children[0].value;
513
				addrShdLimit[i] = tblLimits.rows[i].cells[3].children[0].value;
514
			}
515
516
			ae.setLimits(storageLimit, addrNrmLimit, addrShdLimit, function(error) {
517
				if (error !== 0) {
518
					console.log("Failed to update limits");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
519
				}
520
			});
521
		};
522
523
		ae.Account_Browse(function(error) {
0 ignored issues
show
Unused Code introduced by
The parameter error is not used and could be removed.

This check looks for parameters in functions that are not used in the function body and are not followed by other parameters which are used inside the function.

Loading history...
524
			for (let i = 0; i < ae.admin_getUserCount(); i++) {
525
				addRowAdmin(i);
526
			}
527
		});
528
	}
529
}
530
531
document.getElementById("btn_inbox_prev").onclick = function() {
532
	if (page > 0) {
533
		page--;
534
		clearMessages();
535
		addMessages();
536
		this.disabled = (page === 0);
537
	}
538
};
539
540
document.getElementById("btn_inbox_next").onclick = function() {
541
// TODO: Check if page too high
542
//	if (page > 0) {
543
		page++;
544
		clearMessages();
545
		addMessages();
546
		document.getElementById("btn_inbox_prev").disabled = false;
547
//	}
548
};
549
550
document.getElementById("btn_enter").onclick = function() {
551
	const txtUmk = document.getElementById("txt_umk");
552
	if (!txtUmk.reportValidity()) return;
553
554
	const btn = this;
555
	btn.disabled = true;
556
557
	ae.setKeys(txtUmk.value, function(success) {
558
		if (!success) {
559
			document.getElementById("begin_message").hidden = false;
560
			document.getElementById("begin_message").textContent = "Error: Invalid key format";
561
			btn.disabled = false;
562
			return;
563
		}
564
565
		ae.Message_Browse(false, true, function(error) {
566
			if (error !== 0) {
567
				document.getElementById("begin_message").hidden = false;
568
				document.getElementById("begin_message").textContent = "Error: " + ae.getErrorMessage(error);
569
				btn.disabled = false;
570
				return;
571
			}
572
573
			txtUmk.value = "";
574
			reloadInterface();
575
			addMessages();
576
		});
577
	});
578
};
579
580
document.getElementById("btn_refresh").onclick = function() {
581
	const btn = this;
582
	btn.disabled = true;
583
584
	ae.Message_Browse(true, false, function(error) {
585
		if (error === 0) {
586
			clearMessages();
587
			addMessages();
588
			for (let i = ae.getUplMsgCount() - 1; i >= 0; i--) {addFile(i);}
589
		} else {
590
			console.log("Failed to refresh");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
591
		}
592
593
		btn.disabled = false;
594
	});
595
};
596
597
document.getElementById("btn_contact_add").onclick = function() {
598
	const txtMail = document.getElementById("txt_newcontact_mail");
599
	const txtName = document.getElementById("txt_newcontact_name");
600
	const txtNote = document.getElementById("txt_newcontact_note");
601
602
	addContactToTable(txtMail.value, txtName.value, txtNote.value);
603
	ae.addContact(txtMail.value, txtName.value, txtNote.value);
604
605
	txtMail.value = "";
606
	txtName.value = "";
607
	txtNote.value = "";
608
609
	document.getElementById("btn_savenotes").hidden = false;
610
};
611
612
document.getElementById("btn_savenotes").onclick = function() {
613
	ae.Private_Update(function(error) {
614
		if (error === 0) {
615
			document.getElementById("btn_savenotes").hidden = true;
616
		} else {
617
			console.log("Failed to save note data");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
618
		}
619
	});
620
};
621
622
document.getElementById("btn_msgdel").onclick = function() {
623
	delMsgs("tbody_inbox", "btn_msgdel");
624
};
625
626
document.getElementById("btn_sentdel").onclick = function() {
627
	delMsgs("tbody_sentbox", "btn_sentdel");
628
};
629
630
document.getElementById("btn_send").onclick = function() {
631
	const btn = this;
632
	btn.disabled = true;
633
634
	const sfrom = document.getElementById("send_from");
635
	const stitle = document.getElementById("send_title");
636
	const sto = document.getElementById("send_to");
637
	const sbody = document.getElementById("send_body");
638
639
	if (!stitle.reportValidity() || !sto.reportValidity() || !sbody.reportValidity()) return;
640
641
	ae.Message_Create(stitle.value, sbody.value, sfrom.value, sto.value, null, null, function(error) {
642
		if (error === 0) {
643
			stitle.value = "";
644
			sto.value = "";
645
			sbody.value = "";
646
		} else {
647
			console.log("Failed sending message: " + ae.getErrorMessage(error));
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
648
		}
649
650
		btn.disabled = false;
651
	});
652
};
653
654
document.getElementById("btn_newaddress").onclick = function() {
655
	if (ae.getAddressCountNormal() >= ae.getLimitNormalA(ae.getOwnLevel())) return;
656
657
	const txtNewAddr = document.getElementById("txt_newaddress");
658
	if (!txtNewAddr.reportValidity()) return;
659
660
	const btnN = document.getElementById("btn_newaddress");
661
	const btnS = document.getElementById("btn_newshieldaddress");
662
	btnN.disabled = true;
663
	btnS.disabled = true;
664
665
	ae.Address_Create(txtNewAddr.value, function(error1) {
666
		if (error1 === 0) {
667
			ae.Private_Update(function(error2) {
668
				document.getElementById("addr_use_normal").textContent = ae.getAddressCountNormal();
669
				addAddress(ae.getAddressCount() - 1);
670
				txtNewAddr.value = "";
671
672
				if (error2 !== 0) console.log("Failed to update the Private field");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
673
				if (ae.getAddressCountNormal() < ae.getLimitNormalA(ae.getOwnLevel())) btnN.disabled = false;
674
				if (ae.getAddressCountShield() < ae.getLimitShieldA(ae.getOwnLevel())) btnS.disabled = false;
675
			});
676
		} else {
677
			console.log("Failed to add address");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
678
			if (ae.getAddressCountNormal() < ae.getLimitNormalA(ae.getOwnLevel())) btnN.disabled = false;
679
			if (ae.getAddressCountShield() < ae.getLimitShieldA(ae.getOwnLevel())) btnS.disabled = false;
680
		}
681
	});
682
};
683
684
document.getElementById("btn_newshieldaddress").onclick = function() {
685
	if (ae.getLimitShieldA() >= ae.getLimitShieldA(ae.getOwnLevel())) return;
686
687
	const btnN = document.getElementById("btn_newaddress");
688
	const btnS = document.getElementById("btn_newshieldaddress");
689
	btnN.disabled = true;
690
	btnS.disabled = true;
691
692
	ae.Address_Create("SHIELD", function(error1) {
693
		if (error1 !== 0) {
694
			console.log("Failed to add Shield address");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
695
			if (ae.getAddressCountNormal() < ae.getLimitNormalA(ae.getOwnLevel())) btnN.disabled = false;
696
			if (ae.getAddressCountShield() < ae.getLimitShieldA(ae.getOwnLevel())) btnS.disabled = false;
697
			return;
698
		}
699
700
		ae.Private_Update(function(error2) {
701
			document.getElementById("addr_use_shield").textContent = ae.getAddressCountShield();
702
			addAddress(ae.getAddressCount() - 1);
703
704
			if (error2 !== 0) console.log("Failed to update the Private field");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
705
			if (ae.getAddressCountNormal() < ae.getLimitNormalA(ae.getOwnLevel())) btnN.disabled = false;
706
			if (ae.getAddressCountShield() < ae.getLimitShieldA(ae.getOwnLevel())) btnS.disabled = false;
707
		});
708
	});
709
};
710
711
document.getElementsByTagName("fieldset")[0].onchange = function() {
712
	document.getElementById("btn_saveaddrdata").hidden = false;
713
};
714
715
document.getElementById("btn_saveaddrdata").onclick = function() {
716
	this.disabled = true;
717
718
	const tbl = document.getElementById("tbody_opt_addr");
719
720
	for (let i = 0; i < tbl.rows.length; i++) {
721
		ae.setAddressAccExt(i, tbl.rows[i].cells[1].firstChild.checked);
722
		ae.setAddressAccInt(i, tbl.rows[i].cells[2].firstChild.checked);
723
		ae.setAddressAllVer(i, tbl.rows[i].cells[3].firstChild.checked);
724
		ae.setAddressAttach(i, tbl.rows[i].cells[4].firstChild.checked);
725
		ae.setAddressSecure(i, tbl.rows[i].cells[5].firstChild.checked);
726
		ae.setAddressOrigin(i, tbl.rows[i].cells[6].firstChild.checked);
727
	}
728
729
	const btn = document.getElementById("btn_saveaddrdata");
730
731
	ae.Address_Update(function(error) {
732
		if (!error) {
733
			btn.hidden = true;
734
		} else {
735
			console.log("Failed to save address data");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
736
		}
737
738
		btn.disabled = false;
739
	});
740
};
741
742
document.getElementById("btn_admin_reg").onclick = function() {
743
	const txtEpk = document.getElementById("txt_reg_epk");
744
	const txtUak = document.getElementById("txt_reg_uak");
745
746
	if (!txtEpk.reportValidity() || !txtUak.reportValidity()) return;
747
748
	const btn = document.getElementById("btn_admin_reg");
749
	btn.disabled = true;
750
751
	ae.Account_Create(txtUak.value, txtEpk.value, function(error) {
752
		if (error === 0) {
753
			addRowAdmin(ae.admin_getUserCount() - 1);
754
			txtEpk.value = "";
755
			txtUak.value = "";
756
		} else {
757
			console.log("Failed to add account");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
758
		}
759
	});
760
761
	btn.disabled = false;
762
};
763
764
document.getElementById("upfile").onchange = function() {
765
	const fn = this.files[0].name;
766
	const reader = new FileReader();
767
768
	reader.onload = function() {
769
		ae.Message_Upload(fn, new Uint8Array(reader.result), function(error) {
770
			if (error === 0) {
771
				addFile(0);
772
				document.getElementById("upfile").value = "";
773
			} else {
774
				console.log("Failed to upload file");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
775
			}
776
		});
777
	};
778
779
	reader.readAsArrayBuffer(this.files[0]);
780
};
781
782
function navNotesMenu(num) {
783
	for (let i = 0; i < 3; i++) {
784
		const isCurrent = (i === num);
785
		document.getElementById("div_notes").children[0].children[i].disabled = isCurrent;
786
		document.getElementById("div_notes").children[1 + i].hidden = !isCurrent;
787
	}
788
}
789
790
let btns = document.getElementsByTagName("nav")[0].getElementsByTagName("button");
791
btns[0].onclick = function() {navMenu(0);};
792
btns[1].onclick = function() {navMenu(1);};
793
btns[2].onclick = function() {navMenu(2);};
794
btns[3].onclick = function() {navMenu(3);};
795
btns[4].onclick = function() {navMenu(4);};
796
797
btns = document.getElementById("div_notes").getElementsByTagName("button");
798
btns[0].onclick = function() {navNotesMenu(0);};
799
btns[1].onclick = function() {navNotesMenu(1);};
800
btns[2].onclick = function() {navNotesMenu(2);};
801
802
document.getElementById("txt_umk").onkeyup = function(e) {
803
	if (e.key === "Enter") document.getElementById("btn_enter").click();
804
};
805
806
navMenu(0);
807
808
});
809